//
//  ZLKVOViewController.m
//  ZLClient
//
//  Created by lizhu on 2017/6/27.
//  Copyright © 2017年 zhuli. All rights reserved.
//

#import "ZLKVOViewController.h"
#import "ZLProduct.h"

@interface ZLKVOViewController ()

@end

@implementation ZLKVOViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    NSMutableArray *array=[NSMutableArray array];
    for (int i=0; i<10; i++) {
        ZLProduct *product=[[ZLProduct alloc] init];
        product.name=[NSString stringWithFormat:@"iphone%d",i];
        product.price=i;
        product.launchedOn=[NSDate dateWithTimeIntervalSinceNow:i];
        
        [array addObject:product];
    }
    
    //参考文档http://nshipster.cn/kvc-collection-operators/
#pragma mark - 简单集合操作符
    
    //返回一个值为集合中对象总数的NSNumber对象
    NSNumber *count=[array valueForKeyPath:@"@count.self"];
    NSLog(@"返回一个值为集合中对象总数的NSNumber对象===%@",count);
    
    //首先把集合中的每个对象都转换为double类型，然后计算其总，最后返回一个值为这个总和的NSNumber对象。
    NSNumber *sum=[array valueForKeyPath:@"@sum.price"];
    NSLog(@"sum=%@",sum);
    
    //把集合中的每个对象都转换为double类型，返回一个值为平均值的NSNumber对象。
    NSNumber *avg=[array valueForKeyPath:@"@avg.price"];
    NSLog(@"avg=%@",avg);
    
    //使用compare:方法来确定最大值。所以为了让其正常工作，集合中所有的对象都必须支持和另一个对象的比较。
    double max=[[array valueForKeyPath:@"@max.price"] doubleValue];
    NSLog(@"max=%f",max);
    
    double min=[[array valueForKeyPath:@"@min.price"] doubleValue];
    NSLog(@"min=%f",min);
    
#pragma mark - 对象操作符
    //@unionOfObjects / @distinctUnionOfObjects: 返回一个由操作符右边的key path所指定的对象属性组成的数组。其中@distinctUnionOfObjects 会对数组去重, 而且 @unionOfObjects 不会.
    for (int i=0; i<10; i++) {
        ZLProduct *product=[[ZLProduct alloc] init];
        product.name=[NSString stringWithFormat:@"iphone%d",i];
        product.price=i;
        product.launchedOn=[NSDate dateWithTimeIntervalSinceNow:i];
        
        [array addObject:product];
    }
    NSArray *unionOfObjects= [array valueForKeyPath:@"@unionOfObjects.name"];//20
    NSArray *distinctUnionOfObjects=[array valueForKeyPath:@"@distinctUnionOfObjects.name"];//10
    NSArray *distinctUnionOfObjects1=[array valueForKeyPath:@"@distinctUnionOfObjects.self"];//20

#pragma mark - 数组和集合操作符
    //@distinctUnionOfArrays / @unionOfArrays: 返回了一个数组，其中包含这个集合中每个数组对于这个操作符右面指定的key path进行操作之后的值。正如你期望的，distinct版本会移除重复的值。
//    [@[appleStoreInventory, verizonStoreInventory] valueForKeyPath:@"@distinctUnionOfArrays.name"]; // "iPhone 5", "iPad Mini", "MacBook Pro"

    //@distinctUnionOfSets: 和@distinctUnionOfArrays差不多, 但是它期望的是一个包含着NSSet对象的NSSet，并且会返回一个NSSet对象。因为集合不能包含重复的值，所以它只有distinct操作。
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end
